選一個好的名稱是相當花時間的,但省下來的時間比花掉的還多。
我知道命名的基本原則,就是變數名稱必須具備意義。
在我剛開始學程式時,聽到有人將第一個變數名稱取名為 dog,第二個是 dogdog,第三個 dogdogdog......以此類推。
當下我和朋友聽到時不禁哄堂大笑,譁然聲此起彼落,畢竟這樣的命名方式除了讓別人知道自己是狗派人士外,對於程式沒有任何幫助。
所以我一直謹記著變數要有意義的原則,除了迴圈內索引慣例會使用 i、j、k 外,極力避免單詞及無意義的變數名。
我也慶幸自己堅持這樣的原則,讓我避開了書中約三分之一指稱不妥的內容。
然而我並沒有真正理解「有意義」的變數名所代表的含意。
剛好最近在專案上碰到了一些問題,正是關於命名的原則,雖然隱隱感到了哪裡有些狀況,卻一直未曾細究。
通常專案裡,會有大量意義相近的元件或功能,如果我今天要完成一個檢查系統,我可能會用到大量的 inspection 相關變數名,例如 inspectionType、inspectionItem、inspectionDate......等。
可是名稱不夠了,所以我換一個字來用:check(或 checking)。
而這正是惡夢的開始。
隨著專案越來越龐大,我漸漸開始被自己搞混,因為我分不出 inspection 跟 checking 有什麼差別?recordInfo 與 recordData 區別是什麼?這些變數背後所代表的意義有什麼不同?
是的,沒有不同。
因為我當初只是因為同一個 scope 內變數 / 類別 / 函式名稱不能重複,就換一個字來用。
是我自己讓變數名稱的意義漸漸喪失,漸漸地不再明確。
於是必須頻繁地察看上下文以及其對應的內容,才能找到自己想要使用的變數是哪個,隨之而來的,就是效率的降低與心理漸積的疲乏。
直到讀完這篇內容,我開始對有意義的命名有了新的認識。
上面的例子是同樣的意思用了不同的字表達,導致自己也分不出誰是誰,而另一種類似的情境,是不同的意思卻用了相同的名稱。
舉例來說,假設我們有許多類別的 add 方法,是用來相加或相連兩個現有的值,然後形成新的值。假設我們要再寫一個新的類別,此類別有一個方法,會將單一個參數放入一個集合容器中,我們可以將之稱為 add 嗎?......語意是不同的,所以我們應該使用像 insert (插入)或 append (附加)之類的名稱。把新的方法也命名為 add ,就是一種雙關語的表現。
類別和物件應該使用名詞或名詞片語命名,而方法則使用動詞或動詞片語命名。
另外,根據 javabean 的標準,用 get、set 字首分別做存、取器命名,判定則用 is 做字首。這部分倒是幾乎約定成俗了(至少在看其他人的 code 時頗多此種用法)。
這篇內容讀起來相當愉快,一方面知道自己對於變數的堅持確實有其成效,另一方面發現自己的不足之處,剛好解決手上專案所面臨的問題。
跟大家分享在書中我很喜歡的一段話:
如果我們每次簽入時,都能讓程式碼比簽出時,來得整潔一點點,如此,程式碼根本不會腐壞。
我可能沒有精力大刀闊斧的去修改整個專案,但每次遇到時一點一滴的修改、完善,既不背負太大的壓力,又能參與並感受程式越來越好的過程,我想這就是目前最適合我的方式了。